package optional.code;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * Description: Optional不推荐的使用方式
 *
 * @author code-worker
 * @date 2021/08/23 7:13
 */
public class BadPractice {

    /**
     * 这样的写法将会给序列化带来麻烦，Optional本身并没有实现序列化，现有的 JSON 序列化框架也没有对此提供支持的。
     */
    private Optional<String> address;

    /**
     * task: Optional不会帮你做任何的空判断或者异常处理，如果直接在代码中使用Optional.get()和不做任何空判断一样，十分危险
     * @date 2021/8/25 7:22
     */
    public void getWithCheckNPE(){
        String str = null;
        System.out.println(Optional.ofNullable(str).get());
    }

    /**
     * task: 用if判断和 1.8 之前的写法并没有什么区别，反而返回值包了一层Optional，
     *       增加了代码的复杂性，没有带来任何实质的收益
     * @date 2021/8/23 7:38
     */
    public void isPresent(){
        DemoClass demoClass = new DemoClass();
        Optional<DemoClass> badUse = Optional.ofNullable(demoClass);
        if(badUse.isPresent()){
            DemoClass presentDemoClass = badUse.get();
            System.out.println("isPresent--没必要过度包装的判空方式: "+presentDemoClass);
        }
        if(Objects.nonNull(demoClass)){
            System.out.println("不使用isPresent直接输出(不香吗): "+demoClass);
        }
    }

    public static void main(String[] args) {
        BadPractice demo = new BadPractice();
        demo.isPresent();
        demo.getWithCheckNPE();
    }

}
